ひとりNavigation API Advent Calendar 17日目
https://gyazo.com/133a724fe23c076802eac6857a57a14a
提案
navigateEvent.transitionWhile() に focusReset オプションを追加する案。
値の候補
"after-transition" → 遷移完了後に <body> または autofocus 要素へフォーカスをリセット
"manual" → 開発者が明示的に focus() を呼び出すまで何もしない
"immediate" → 遷移開始直後にフォーカスをリセット
開発者が autofocus="" を適切に設定することで、ユーザーが望む要素にフォーカスを移せる スクリーンリーダーユーザーは <body> よりも見出しやラッパー要素へのフォーカスを好む傾向がある デフォルトは"after-transition"が望ましいとされている
より複雑なケースは開発者が"manual"を選び、必要に応じて focus()を制御する
次の議論
focusReset: "after-transition"
遷移完了後に <body> または autofocus 属性を持つ要素へフォーカスをリセット
focusReset: "manual"
一律に「リセット」をデフォルトにすると、タブUIなどで不便になる 代替案の検討
DOMに要素が残っている場合はフォーカスを保持し、消えた場合のみリセットする簡易ルール autofocus属性やARIA属性を活用して、より柔軟な制御を可能にする案
開発者に必ずfocusResetを指定させる強制オプション案 結論 (暫定)
現時点ではafter-transitionをデフォルトにする方向で合意 最悪の場合でも、多くのルーターコードがmanualを選ぶだけで大きな問題にはならない 問題提起
特にpush/replace操作時にスクロールがリセットされない点が議論されている push/replace でリセット、reload/traverse で復元 push/replace/reload/non-bfcache traverse でリセット
bfcache traverse で復元
スクロール: push/replace/reload で維持、traverseで復元 フォーカス: push/replace/reload/traverse でリセット
提案
新しいオプションscrollResetを導入し、push/replace 時にスクロールをリセットできるようにする
scrollRestorationをreloadにも適用するよう調整
これにより、同一ドキュメントナビゲーションの挙動をクロスドキュメントナビゲーションに近づける
議論のポイント
UI状態をハッシュで管理している場合、リセットが望ましいケースもある 「リセット」と「復元」を一つのオプションにまとめるか、別々に扱うかについて意見が分かれている
scrollReset と scrollRestoration を分けて扱う方が柔軟で分かりやすい
yamanoku.icon 現時点ではscrollResetではなくscrollで制御する形になってる